home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / cadstop.zip / CADTHIEF.PAS < prev    next >
Pascal/Delphi Source File  |  1991-02-05  |  3KB  |  134 lines

  1. UNIT CADThief;
  2.  
  3. {Intercept Control+Alternate+Delete keypresses}
  4.  
  5. INTERFACE
  6.  
  7. USES Crt,Dos;
  8.  
  9. FUNCTION GetCAD   : boolean;
  10. FUNCTION HandleCADs: boolean;
  11.  
  12. IMPLEMENTATION
  13.  
  14. VAR
  15.    OldInt09,OldExitProc: pointer;
  16.    KeyStat: ^byte;
  17.    CADStatus: boolean;
  18.  
  19. PROCEDURE GoOldInt(OldIntVector: pointer);
  20. INLINE(
  21.    $5B/    {POP BX - Get Segment}
  22.    $58/    {POP AX - Get Offset}
  23.    $89/    {MOV SP,BP}
  24.    $EC/
  25.    $5D/    {POP BP}
  26.    $07/    {POP ES}
  27.    $1F/    {POP DS}
  28.    $5F/    {POP DI}
  29.    $5E/    {POP SI}
  30.    $5A/    {POP DX}
  31.    $59/    {POP CX}
  32.    $87/    {XCHG SP,BP}
  33.    $EC/
  34.    $87/    {XCHG [BP],BX}
  35.    $5E/
  36.    $00/
  37.    $87/    {XCHG [BP+2],AX}
  38.    $46/
  39.    $02/
  40.    $87/    {XCHG SP,BP}
  41.    $EC/
  42.    $CB);   {RETF}
  43.  
  44. PROCEDURE SetCAD(Status: boolean);
  45.   BEGIN
  46.     CADStatus := Status     {Set flag}
  47.   END;
  48.  
  49. FUNCTION GetCAD: boolean;
  50.   BEGIN
  51.     GetCAD := CADStatus;
  52.   END;
  53.  
  54. {$F+}
  55. PROCEDURE NewExitProc;
  56. {$F-}
  57.  BEGIN
  58.    ExitProc := OldExitProc;
  59.    SetIntVec($09,OldInt09);
  60.    CheckBreak := TRUE
  61.  END;
  62.  
  63. {$F+}
  64. PROCEDURE NewInt09(AX,BX,CX,DX,SI,DI,DS,ES,BP: Word); INTERRUPT;
  65. {$F-}
  66.  VAR
  67.    I,J : integer;
  68.  CONST
  69.    KsDelCode = $53;
  70.  BEGIN
  71.    I := Port[$60];       {Get Scan Code}
  72.    if ((I and $7F) = KsDelCode) and  {DEL key?}
  73.      ((KeyStat^ and $0C) = $0C)      {CTL + ALT ?}
  74.      THEN
  75.    BEGIN
  76.      SetCAD(TRUE);
  77.      J := Port[$61];{Save Kbd Status}
  78.      Port[$61] := J and $80; {Reset Kbd Int}
  79.      Port[$61] := J and $7F;
  80.      Port[$20] := $20;
  81.      Sound(880);Delay(100);Sound(1220);Delay(250);NoSound;
  82.    END
  83.       ELSE
  84.    GoOldInt(OldInt09)
  85.  END;
  86.  
  87. FUNCTION HandleCADs: boolean;
  88.  
  89. VAR
  90.    XPos,YPos: byte;
  91.    A : char;
  92.    Regs : Registers;
  93.  
  94. BEGIN
  95.   WITH Regs DO   {Flush keyboard buffer}
  96.     BEGIN
  97.       AH := $0C;
  98.       AL := 0;
  99.       MsDOS(Regs)
  100.     END;
  101.   XPos :=WhereX;      {Save old cursor position}
  102.   YPos := WhereY;
  103.   GotoXY(1,1);
  104.   WriteLn('Ctrl+Alt+Del pressed');
  105.   Delay(250);Sound(1600);Delay(250);NoSound;
  106.   GotoXY(1,1);WriteLn('                    ');
  107.   GotoXY(1,1);Write('Are you sure you want to quit? ');
  108.   A := ReadKey;Write(A);
  109.   GotoXY(1,1);Write('                                ');
  110.   IF UpCase(A) = 'Y' THEN
  111.      HandleCADs := TRUE
  112.   ELSE
  113.      HandleCADs := FALSE;
  114.   GotoXY(XPos,YPos);SetCAD(FALSE)
  115. END;
  116.  
  117. PROCEDURE InstallCADHndlr;
  118.  
  119.   BEGIN
  120.     OldExitProc := ExitProc;
  121.     ExitProc := @NewExitProc;
  122.     GetIntVec($09,OldInt09);
  123.     SetIntVec($09,@NewInt09);
  124.     SetCBreak(FALSE);
  125.     CheckBreak := FALSE;
  126.     KeyStat := Ptr($40,$17);
  127.   END;
  128.  
  129. BEGIN
  130.   InstallCADHndlr;
  131.   SetCAD(FALSE)
  132. END.
  133.  
  134.